//自定义指令集
/* 所有的html的防抖  v-dbClick*/
let beforeSubmitValidate;
export default {}.install = (Vue, options = {}) => {
    //配置msg文字
    let msgConfig = {
        phone: "手机号不正确",
        email: "邮箱不正确",
        idCard: "身份证不正确",
        passWord: "密码由6-12位字母和数字组成",
        max: "长度超过限制",
        min: "字段位数不对",
        required: "不能为空"
    }
    //当有全局定义时采用全局定义
    if (typeof AppConfig != "undefined") {
        msgConfig = AppConfig.msgConfig ? Object.assign(msgConfig, AppConfig.msgConfig) : msgConfig;
    }
    //
    let validateArr = [];
    let validateRule = {};//需要验证的规则 对象 ：{key:phone,Rule:['required','phone']}
    let hval;//用户输入的值 当时
    let hkey;//需要验证的可以 及时
    let validateResult = {};//验证结果
    let showMsg = false;
    Vue.directive('hvali', {
        // 只调用一次，指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 
        bind(el, binding, vnode, oldVnode) {
            validateResult = {};
            //console.log("hvalidate>>>>bind", el, binding, vnode, oldVnode);
            validateRule = {};
        },
        // 当被绑定的元素插入到 DOM 中时……
        inserted(el, binding, vnode, oldVnode) {
            validateRule[binding.value.key] = binding.value.rule.split("|");
            validateArr.push(binding.value);
            el.focus();//聚焦
            //获取 需要验证的key和对应的规则
            console.log("validateRule>>>>", validateRule);
            console.log("validateArr>>>>", validateArr);
            //keydown键盘按下时 及时检查
            el.addEventListener('keydown', e => {
                setTimeout(() => {
                    hval = el.value;
                    hkey = binding.value.key;
                    fhvalidate();
                }, 200)
            }, true);
            //blur 失去焦点时 检查
            el.addEventListener('blur', e => {
                hval = el.value;
                hkey = binding.value.key;
                fhvalidateBlur();
            }, true);
            //当showMsg为false时 最后失去焦点
            setTimeout(() => {
                el.blur();
                showMsg = false;
            }, 500)

        },
        // 所在组件的 VNode 更新时调用，但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变，也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
        update(el, binding, vnode, oldVnode) {
            // console.log("directive>>>>update");
        },
        //指令所在组件的 VNode 及其子 VNode 全部更新后调用。
        componentUpdated(el, binding, vnode, oldVnode) {
            //console.log("directive>>>>componentUpdated");
        },
        //只调用一次，指令与元素解绑时调用。
        unbind(el, binding, vnode, oldVnode) {
            //console.log("directive>>>>unbind");
            validateRule = {};
            validateResult = {};//验证结果
            validateArr = [];
        }
    })

    /**
 * 
 * @param {*} v 
 * required 必须
 * email 邮箱
 * phone 手机
 * max 最大长度
 * idCard 身份证
 * trim 去空格
 * password 密码
 */
    //统一验证 及时
    function fhvalidate() {
        var v = hval;
        let RuleArr = validateRule[hkey];
        var msg = "";
        for (var i = 0; i < RuleArr.length; i++) {
            var h = RuleArr[i];
            v+="";
            //手机号
            if (h.indexOf("phone") > -1) {
                var patrn = /^[1][3,4,5,7,8][0-9]{9}$/;
                if (!patrn.test(v)&&v.length>=11) {
                    msg += msgConfig.phone + " ";
                }
            }
            //身份证
            if (h.indexOf("idCard") > -1) {
                var patrn = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
                if (!patrn.test(v)&&v.length>=18) {
                    msg += msgConfig.idCard + " ";
                }
            }
            //最大位数
            if (h.indexOf("max") > -1) {
                if (v) {
                    if ((v + "").length > h.split(":")[1]) {
                        msg += msgConfig.max + " ";
                    }
                }
            }
        }
        if (msg) {
            nshowMsg(msg);
        }
    }

    /**
     * required 必须
     * email 邮箱
     * phone 手机
     * max 最大长度
     * idCard 身份证
     * trim 去空格
     * password 密码
     */
    // 失去焦点时验证
    function fhvalidateBlur() {
        var v = hval;
        var msg = "";
        let RuleArr = validateRule[hkey];
        //有两个属性是为了在 是否显示rule（验证结果）的错误提示，有required且为true则判断rule
        let nResult = { required: false, rule: false }//
        //console.log("失去》》》》》》焦点", validateRule, hkey, RuleArr);
        for (var i = 0; i < RuleArr.length; i++) {
            var h = RuleArr[i];
            //必须
            if (h.indexOf("required") > -1) {
                if (!v) {
                    msg += msgConfig.required + " ";
                }
                nResult.required = true;
            }
            //手机号
            if (h.indexOf("phone") > -1) {
                var patrn = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
                if (v) {
                    if (!patrn.test(v)) {
                        msg += msgConfig.phone + " ";
                    }
                }

            }
            //身份证
            if (h.indexOf("idCard") > -1) {
                var patrn = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
                if (v) {
                    if (!patrn.test(v)) {
                        msg += msgConfig.idCard + " ";
                    }
                }
            }
            //邮箱
            if (h.indexOf("email") > -1) {
                var patrn = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
                if (v) {
                    if (!patrn.test(v)) {
                        msg += msgConfig.email + " ";
                    }
                }
            }
            //密码6-12位字母和数字组成
            if (h.indexOf("passWord") > -1) {
                var patrn = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/;
                if (!patrn.test(v)) {
                    msg += msgConfig.passWord + " ";
                }
            }
            //最大位数
            if (h.indexOf("max") > -1) {
                if (v) {
                    if ((v + "").length > h.split(":")[1]) {
                        msg += msgConfig.max + " ";
                    }
                }
            }
            //最小位数
            if (h.indexOf("min") > -1) {
                if (v) {
                    if ((v + "").length < h.split(":")[1]) {
                        msg += msgConfig.min + " ";
                    }
                }
            }
            //去掉空格
            if (h.indexOf("trim") > -1) {

            }
        }
        if (msg) {
            nResult.rule = false;
            //validateResult[hkey] = false;
        } else {
            nResult.rule = true;
            //validateResult[hkey] = true;
        }
        if (showMsg) {
            nshowMsg(msg);
        } else {
            showMsg = true;
        }
        validateResult[hkey] = nResult;
    }
    //根据key获取msg提示
    function getMsgByKey(key) {
        for (let index = 0; index < validateArr.length; index++) {
            const element = validateArr[index];
            if (element.key == key) {
                return element.msg;
            }
        }
    }
    //显示错误信息
    function nshowMsg(v){
          console.log("错误信息",v);
    }
    //提交之前验证
    beforeSubmitValidate = function (callback) {
        console.log("beforeSubmitValidate", validateResult, validateRule,validateArr);
        setTimeout(() => {
            let res = true;
            let msg = "";
            for (var v in validateResult) {
                let ov = validateResult[v];
                //只有当必须的选项 验证通过才算 校验完成
                //处理验证结果
                if (ov.required) {
                    res = ov.rule && res;
                }
                //这边处理错误信息
                if (!ov.rule) {
                    if (!getMsgByKey(v)) {
                        var resArr = validateRule[v];
                        var str = "";
                        for (var si = 0; si < resArr.length; si++) {
                            if (resArr[si] == "required") {
                                str += v + msgConfig[resArr[si]] + " ";
                            } else {
                                str += msgConfig[resArr[si]] + " ";
                            }
                        }
                        msg += str;
                    }else{
                        msg += getMsgByKey(v)+" ";
                    }

                }
            }
            //
            if (res) {
                callback();
            } else {
                nshowMsg(msg);
            }
        })
    }

    window.beforeSubmitValidate = beforeSubmitValidate;
}

